// Copyright (c) 2012 Ecma International.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es5id: 7.6.1-4-2
description: >
    Allow reserved words as property names by accessor functions within an object.
---*/

function Test() {
    var test;

    var tokenCodes = {
        set await(value) { test = "await"; },
        get await() { return "await"; },
        set break(value) { test = "break"; },
        get break() { return "break"; },
        set case(value) { test = "case"; },
        get case() { return "case"; },
        set catch(value) { test = "catch"; },
        get catch() { return "catch"; },
        set class(value) { test = "class"; },
        get class() { return "class"; },
        set const(value) { test = "const"; },
        get const() { return "const"; },
        set continue(value) { test = "continue"; },
        get continue() { return "continue"; },
        set debugger(value) { test = "debugger"; },
        get debugger() { return "debugger"; },
        set default(value) { test = "default"; },
        get default() { return "default"; },
        set delete(value) { test = "delete"; },
        get delete() { return "delete"; },
        set do(value) { test = "do"; },
        get do() { return "do"; },
        set else(value) { test = "else"; },
        get else() { return "else"; },
        set export(value) { test = "export"; },
        get export() { return "export"; },
        set extends(value) { test = "extends"; },
        get extends() { return "extends"; },
        set finally(value) { test = "finally"; },
        get finally() { return "finally"; },
        set for(value) { test = "for"; },
        get for() { return "for"; },
        set function(value) { test = "function"; },
        get function() { return "function"; },
        set if(value) { test = "if"; },
        get if() { return "if"; },
        set import(value) { test = "import"; },
        get import() { return "import"; },
        set in(value) { test = "in"; },
        get in() { return "in"; },
        set instanceof(value) { test = "instanceof"; },
        get instanceof() { return "instanceof"; },
        set new(value) { test = "new"; },
        get new() { return "new"; },
        set return(value) { test = "return"; },
        get return() { return "return"; },
        set super(value) { test = "super"; },
        get super() { return "super"; },
        set switch(value) { test = "switch"; },
        get switch() { return "switch"; },
        set this(value) { test = "this"; },
        get this() { return "this"; },
        set throw(value) { test = "throw"; },
        get throw() { return "throw"; },
        set try(value) { test = "try"; },
        get try() { return "try"; },
        set typeof(value) { test = "typeof"; },
        get typeof() { return "typeof"; },
        set var(value) { test = "var"; },
        get var() { return "var"; },
        set void(value) { test = "void"; },
        get void() { return "void"; },
        set while(value) { test = "while"; },
        get while() { return "while"; },
        set with(value) { test = "with"; },
        get with() { return "with"; },
        set yield(value) { test = "yield"; },
        get yield() { return "yield"; },

        set enum(value) { test = "enum"; },
        get enum() { return "enum"; },

        set implements(value) { test = "implements"; },
        get implements() { return "implements"; },
        set interface(value) { test = "interface"; },
        get interface() { return "interface"; },
        set package(value) { test = "package"; },
        get package() { return "package"; },
        set private(value) { test = "private"; },
        get private() { return "private"; },
        set protected(value) { test = "protected"; },
        get protected() { return "protected"; },
        set public(value) { test = "public"; },
        get public() { return "public"; },

        set let(value) { test = "let"; },
        get let() { return "let"; },
        set static(value) { test = "static"; },
        get static() { return "static"; },
    };

    var arr = [
        'await',
        'break',
        'case',
        'catch',
        'class',
        'const',
        'continue',
        'debugger',
        'default',
        'delete',
        'do',
        'else',
        'export',
        'extends',
        'finally',
        'for',
        'function',
        'if',
        'import',
        'in',
        'instanceof',
        'new',
        'return',
        'super',
        'switch',
        'this',
        'throw',
        'try',
        'typeof',
        'var',
        'void',
        'while',
        'with',
        'yield',

        'enum',

        'implements',
        'interface',
        'package',
        'protected',
        'private',
        'public',

        'let',
        'static',
    ];

    for (var i = 0; i < arr.length; ++i) {
        var propertyName = arr[i];

        assert(tokenCodes.hasOwnProperty(propertyName),
               'Property "' + propertyName + '" found');

        assert.sameValue(tokenCodes[propertyName], propertyName,
                         'Property "' + propertyName + '" has correct value');

        tokenCodes[propertyName] = 0;
        assert.sameValue(test, propertyName,
                         'Property "' + propertyName + '" sets correct value');
    }
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
